local core                 = require("apisix.core")
local ffi = require "ffi"

local lib = {}
function lib.load(so)
    local script_dir = debug.getinfo(1, "S").source:match("@(.*/)") or ""
    local apisix_so = ffi.load(script_dir .. so .. ".so")
    return apisix_so
end

local proxy = lib.load("proxy")
ffi.cdef[[
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
typedef _GoString_ GoString;
extern char* CMD(GoString cmd);
extern void Free(void* p);
]]


function lib.GoString(str) 
    local go_str = ffi.new("GoString")
    go_str.p = str;
    go_str.n = #str
    return go_str
end

function lib.ToString(res)
    local resStr = ffi.string(res)
    proxy.Free(res)
    return resStr
end

function lib.CMD(cmdStr)
    local s = lib.GoString(cmdStr)
    local res = proxy.CMD(s)
    return lib.ToString(res)
end
